// 1.rust通过所有权机制来管理内存。
// 2.堆和栈。
// 编译的时候数据的类型大小是固定的，就是分配在栈上的。
// 编译的时候数据的类型大小不固定，就是分配在堆上的。
// 3.作用域.
// 4.String内存释放.
// 5.移动.
// 6.clone.
// 7.栈上数据拷贝.
// 8.函数和作用域.
fn main() {
    let x: i32 = 1;

    {
        let y: i32 = 12;
            println!("x = {}", x);
            println!("y = {}", y);
    }

    {
        let mut str1 = String::from("hello");
        str1.push_str(" world2");
        println!("str1 = {}", str1);
    }
    println!("Hello, world!");
}
